home *** CD-ROM | disk | FTP | other *** search
/ Aminet 1 / Aminet - June 1993 [Walnut Creek].iso / usenet / sources / volume90 / aplictns / dkbtrace / part10 < prev   
Encoding:
Internet Message Format  |  1990-09-03  |  67.5 KB

  1. Path: abcfd20.larc.nasa.gov!amiga-request
  2. From: amiga-request@abcfd20.larc.nasa.gov (Amiga Sources/Binaries Moderator)
  3. Subject: v90i258: DKBTrace 2.01 - DKBtrace Ray-Tracer, Part10/10
  4. Reply-To: David Schanen <mtv@milton.u.washington.edu>
  5. Newsgroups: comp.sources.amiga
  6. Message-ID: <comp.sources.amiga:v90i258@abcfd20.larc.nasa.gov>
  7. References: <comp.sources.amiga:v90i249@abcfd20.larc.nasa.gov>
  8. Date: 03 Sep 90 23:22:50 GMT
  9. Approved: tadguy@uunet.UU.NET (Tad Guy)
  10. X-Mail-Submissions-To: amiga@uunet.uu.net
  11. X-Post-Discussions-To: comp.sys.amiga
  12.  
  13. Submitted-by: David Schanen <mtv@milton.u.washington.edu>
  14. Posting-number: Volume 90, Issue 258
  15. Archive-name: applications/dkbtrace-2.01/part10
  16.  
  17. #!/bin/sh
  18. # This is a shell archive.  Remove anything before this line, then unpack
  19. # it by saving it into a file and typing "sh file".  To overwrite existing
  20. # files, type "sh file -c".  You can also feed this as standard input via
  21. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  22. # will see the following message at the end:
  23. #        "End of archive 10 (of 10)."
  24. # Contents:  Docs/dkb.doc
  25. # Wrapped by tadguy@abcfd20 on Mon Sep  3 19:21:23 1990
  26. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  27. if test -f 'Docs/dkb.doc' -a "${1}" != "-c" ; then 
  28.   echo shar: Will not clobber existing file \"'Docs/dkb.doc'\"
  29. else
  30. echo shar: Extracting \"'Docs/dkb.doc'\" \(65462 characters\)
  31. sed "s/^X//" >'Docs/dkb.doc' <<'END_OF_FILE'
  32. X
  33. X
  34. X
  35. X
  36. X
  37. X
  38. X                DKBtrace Ray-Tracer, Amiga/IBM Version 2.0
  39. X
  40. X                "It's free, and it's well worth the price!"
  41. X
  42. X
  43. X
  44. X
  45. X
  46. X
  47. X
  48. X     This program was written by:
  49. X
  50. X                         David Buck
  51. X                         22C Sonnet Cres.
  52. X                         Nepean, Ontario
  53. X                         Canada, K2H 8W7
  54. X
  55. X     It has been made freely distributable.  The author retains the copyright
  56. X     to the program but authorizes free distribution by BBS'es, networks or
  57. X     by magnetic media.  The distributer may choose to charge for the cost of
  58. X     the disk but should not sell the software for profit.  Non-profit
  59. X     organizations such as clubs may charge for the software so long as the
  60. X     price is reasonable (less than $5.00 more than the cost of the disk) and
  61. X     so long as the buyers are informed that the program is freely
  62. X     distributable. 
  63. X
  64. X     The images and data files generated by the raytracer are the property of
  65. X     the user of the software and may be used for any purpose without
  66. X     restriction.
  67. X
  68. X     The author makes no guarantees or warantees with this program and claims
  69. X     no responsibility for any damage or loss of time caused by this program.
  70. X     Bug reports may be sent to the author but the author is under no
  71. X     obligation to provide bug fixes, features, or any support for this
  72. X     software.
  73. X
  74. X     I would also like to place the following conditions on the use of this
  75. X     program:
  76. X
  77. X     1) that it should not be used as part of any commercial package without
  78. X        my explicit written consent.
  79. X
  80. X     2) if you make any neat and interesting pictures, please send them to
  81. X        me.
  82. X
  83. X     3) If you make any changes to the source code, please let me know.  I'd
  84. X        like to see what you've done.
  85. X
  86. X     4) This text file should accompany the program.
  87. X
  88. X
  89. X
  90. X     I can be reached on the following BBS'es
  91. X
  92. X     ATX       (613) 526-4141
  93. X     OMX       (613) 731-3419
  94. X     Mystic    (613) 731-0088 or (613) 731-6698
  95. X     FidoNet   1:163/109.9
  96. X     Bitnet    David_Buck@Carleton.CA
  97. X
  98. X
  99. X
  100. X
  101. XSection 0.1 - Recent Update History:
  102. X
  103. X     Version 1.2 First release
  104. X     Version 2.0 Conversion to the IBM done by Aaron A. Collins
  105. X                 New textures, Specular and Phong highlighting added by
  106. X                 Aaron A. Collins
  107. X                 Triangle, Smooth Triangle, Sphere, Plane support added by
  108. X                 David Buck
  109. X                 RAW, IFF and GIF image mapping added by David Buck and Aaron
  110. X                 Collins
  111. X                 Transparency and Fog added by David Buck
  112. X                 GIF format file reader by Steve Bennett (used with permission)
  113. X                 New Noise and DNoise functions by Robert Skinner
  114. X                   (used with permission)
  115. X
  116. X     Aaron Collins can be reached on the following BBS'es
  117. X
  118. X     Lattice BBS                   (708) 916-1200
  119. X     The Information Exchange BBS  (708) 945-5575
  120. X     Stillwaters BBS               (708) 403-2826
  121. X
  122. X     AAC: As of July of 1990, there will be a Ray-Trace specific BBS in the
  123. X     (708) Area Code (Chicago suburbia) for all you Traceaholics out there. 
  124. X     The phone number of this new BBS is (708) 358-5611. I will be Co-Sysop
  125. X     of that board.  There is also a new Ray-Trace and Computer-Generated
  126. X     Art specific SIG on Compuserve, GO COMART.  And now, back to the DOCS...
  127. X
  128. X     Version 2.0 includes ANSI-C function prototyping for ALL functions,
  129. X     TARGA format output file capability, and a reversal of the order of
  130. X     writing screen data from the original DKB/QRT "RAW" file format.  For
  131. X     IBM's, it has a crude VGA 320x200 by 256 color display rendering
  132. X     ability.  If the image requested is larger than 320x200, every other
  133. X     pixel horizontally and vertically is dropped from the display to keep it
  134. X     all on the screen.
  135. X
  136. X     Version 2.0 compiles under Turbo-C 2.0 on the IBM P.C. and Lattice C
  137. X     5.05 on the Amiga.  The only file which contains the ANSI extensions is
  138. X     dkbproto.h, so for non-ANSI compilers, you only need to remove the
  139. X     declaration of the parameters in the config.h file and the whole thing
  140. X     should compile.  There are several example config.h files for Amiga,
  141. X     IBM, and Unix.  The appropriate  one should be copied over CONFIG.H, and
  142. X     the MAKEFILE should be edited for your particular system and compiler
  143. X     configuration before compilation.
  144. X
  145. X     Version 2.0 has a significant difference from prior releases:  Speed!
  146. X     The new primitives of SPHERE, PLANE, TRIANGLE, etc. greatly speed up
  147. X     tracing.  Another significant speed-up is that world X-Y-Z values beyond
  148. X     10 Million or so are ignored, and ray tracing beyond that distance will
  149. X     cease.  This produces 2 minor peculiarities:
  150. X
  151. X     1)   A black stripe at the horizon point of Pre-2.0 scene description
  152. X          .data files that have "ground" and "sky" planes defined.  The
  153. X          planes were traced out to a much greater "infinity" so this effect
  154. X          was unnoticeable, prior to version 2.0.
  155. X     2)   Tiny black pixels in the texture, or "Surface Acne".
  156. X
  157. X
  158. X     This is usually caused by rays being refracted or reflected such that
  159. X     the ray does not happen to hit any object, and eventually becomes black
  160. X     in color as it gets too far away and gets clipped.  This effect can be
  161. X     minimized by enclosing the scene with distant "walls", "floors", or
  162. X     placing "ocean floors" beneath water, etc.  So far, no scenes have
  163. X     required placing such planes behind the camera, unless an "environment
  164. X     map" of sorts is desired.  See SKYTEST.DAT for several examples of
  165. X     spurious distant planes.  If your "acne" still doesn't go away, it may
  166. X     be due to a large pixel sample area and it's accidentally picking a point
  167. X     which is just inside the primitive being hit.  This is a more tricky
  168. X     problem to solve, and anti-aliasing the image will definitely help if
  169. X     this sort of thing occurs.
  170. X
  171. X     For IBM's, the program PICLAB by the Stone Soup Group offers excellent
  172. X     image post-processing features and has direct TARGA 16/24/32 file format
  173. X     compatibility, and will serve to palette map and translate the TARGA
  174. X     images into .GIF's, etc.  The commercial application AUTODESK ANIMATOR
  175. X     offers a CONVERT utility that also does an excellent job of palette
  176. X     mapping a TARGA to .GIF format.  COLORIX VGA PAINT also offers TARGA
  177. X     format reading and conversion facilities.  Those of you  with real TARGA
  178. X     boards can view the files directly in 16 million colors and are lucky
  179. X     and should know it!
  180. X
  181. X     The Stone Soup Group also produces FRACTINT, the best fractal/Mandelbrot
  182. X     program available at ANY price (and it too is FREE!) for the PC.  I
  183. X     (AAC) have borrowed their Public Domain .GIF file reading routines for
  184. X     the Image Map texture.  Here is their Copyright Notice from the GIF
  185. X     Decoder module:
  186. X
  187. X      * DECODER.C - An LZW decoder for GIF
  188. X      * Copyright (C) 1987, by Steven A. Bennett
  189. X      *
  190. X      * Permission is given by the author to freely redistribute and include
  191. X      * this code in any program as long as this credit is given where due.
  192. X      *
  193. X      * In accordance with the above, I want to credit Steve Wilhite, who
  194. X      * wrote the code which this is heavily inspired by...
  195. X      *
  196. X      * GIF and 'Graphics Interchange Format' are trademarks (tm) of
  197. X      * Compuserve, Incorporated, an H&R Block Company.
  198. X
  199. X
  200. X
  201. XSection 0.5 - Program Description:
  202. X
  203. X
  204. X     This program is a ray tracer written completely in C.  It supports
  205. X     arbitrary quadric surfaces (spheres, ellipsoids, cones, cylinders,
  206. X     planes, etc.), constructive solid geometry, and various shading models
  207. X     (reflection, refraction, marble, wood, and many others).  It also has
  208. X     special-case code to handle spheres, planes, triangles, and smooth
  209. X     triangles.  By using these special primitives, the rendering can be done
  210. X     much more quickly than by using the more general quadrics. 
  211. X     In order to create pictures with this program, you must describe the   
  212. X     objects in the world.  This description is a text file called   
  213. X     "<filename>.data", and <filename> defaults to "object" if not specified.
  214. X     Normally, such files are difficult to write and to read.  In order to
  215. X     make this task easier, the program contains a two-pass parser to read
  216. X     the data file.  It allows the user to easily create complex worlds from
  217. X     simple components.  Since the parser allows include files, the user may
  218. X     put the object descriptions into different files and combine them all
  219. X     into one final image.
  220. X
  221. X     This manual is divided into four main sections.  The first section   
  222. X     describes the command-line parameters for the program.  The second
  223. X     section describes the syntax and semantics of the description language. 
  224. X     Some sample worlds and their corresponding images are provided on the
  225. X     disk.  The third section details how to display and convert the images
  226. X     using various postprocesors, and section four has a collection of handy
  227. X     hints for using the tracer most effectively as well as some quick start
  228. X     procedures. 
  229. X
  230. X
  231. XSection 1 - Command Line Parameters
  232. X
  233. X     This program is designed to be run from the CLI, although it can be run
  234. X     from the Workbench if desired.  From the CLI, the program accepts
  235. X     various parameters:
  236. X
  237. X     -wxxx     width of the picture in pixels
  238. X               (On the Amiga, use 319 for full-sized pictures)
  239. X     -hxxx     height of the picture in pixels
  240. X               (On the Amiga, use 400 for full-sized pictures)
  241. X
  242. X     +v        verbose option - print out the scan line number.
  243. X     -v        disable verbose option
  244. X
  245. X     +f        produce an output file
  246. X     -f        don't produce an output file
  247. X
  248. X               If the +f option is used, the ray tracer will produce an
  249. X               output file of the picture.  This output file describes each
  250. X               pixel with 24 bits (8 bits for red, 8 for green, and 8 for
  251. X               blue). A post processor (Amiga only) called "DumpToIFF" can
  252. X               convert this format to hi-res HAM format (320 x 400) making
  253. X               reasonable choices for the colour registers.  For compati-
  254. X               bility, the format of the dump file is the same as the format 
  255. X               for the QRT ray tracer.  With Version 2.0, you can substitute
  256. X               the "t" character for the "f" character and produce output
  257. X               files directly in the Truevision (R) TARGA 24 format.  This
  258. X               format is remarkably like the QRT/DKB raw format, so it was
  259. X               easily done, and allows for a wider range of post-processing
  260. X               programs to be used.  The extension .TGA is normally used for
  261. X               such files, but any may be chosen.
  262. X
  263. X     +d        display the picture while tracing
  264. X     -d        don't display the picture while tracing
  265. X
  266. X               If the +d option is used, then the picture will be displayed
  267. X               while the program performs the ray tracing.  On the Amiga,
  268. X               this picture is not as good as the one created by "DumpToIFF"
  269. X               because it does not try to make optimum choices for the colour
  270. X               registers.  Version 2.0 will produce a display on an IBM-PS/2
  271. X               compatible VGA/MCGA display in 320x200 x 256 colours if the +d
  272. X               option is given (Anyone for adding in SVGA resolutions??) but
  273. X               the same basic caveat is still applicable: A good post-
  274. X               processor will make better choices of the most popular colors
  275. X               in the image to map to the display. 
  276. X
  277. X     +p        wait for prompt (beep and pause) before quitting
  278. X     -p        finish without waiting
  279. X
  280. X               The +p option makes the program wait for a carriage return
  281. X               before exiting (and closing the graphics screen).  This gives
  282. X               you time to admire the final picture before destroying it. 
  283. X
  284. X
  285. X  -ifilename   set the input filename
  286. X  -ofilename   set output filename
  287. X
  288. X               If your input file is not "Object.data", then you can use -i
  289. X               to set the filename.  The default output filename will be
  290. X               "data.display" on Amiga's, and either "data.dis" or "data.tga"
  291. X               on IBM's, depending on the output file format that is being
  292. X               used.  If you want a different output file name, use the -o
  293. X               option.
  294. X
  295. X     +a[xxx]   anti-alias - xxx is an optional tolerance level (default 0.3)
  296. X     -a        don't anti-alias
  297. X
  298. X               The +a option enables adaptive anti-aliasing.  The number
  299. X               after the +a option determines the threshold for the anti-
  300. X               aliasing.  If the colour of a pixel differs from its neighbor
  301. X               (to the left or above) by more than the threshold, then the
  302. X               pixel is subdivided and super-sampled.  The samples are
  303. X               jittered to introduce noise and make the pictures look better. 
  304. X               If the anti-aliasing threshold is 0.0, then every pixel is
  305. X               supersampled.  If the threshold is 1.0, then no anti-aliasing
  306. X               is done.  Good values seem to be around 0.2 to 0.4. 
  307. X
  308. X     +x        allow early exit by hitting any key (IBM only)
  309. X     -x        lock in trace until finished        (IBM only)
  310. X
  311. X               On the IBM, the -e option disables the ability to abort the
  312. X               trace by hitting a key.  If you are unusually clumsy or have
  313. X               CATS that stomp on your keyboard (like I do - AAC :-)), you
  314. X               may want to use it.  If you are writing a file, the system
  315. X               will recognize ^C at the end of line if BREAK is on (on the
  316. X               IBM).  If you aren't writing a file, you won't be able to
  317. X               abort the trace until it's done.
  318. X
  319. X               This option was meant for big, long late-nite traces that take
  320. X               ALL night (or longer!), and you don't want them interrupted by
  321. X               anything less important than a natural disaster such as hur-
  322. X               ricane, fire, flood, famine, etc.
  323. X
  324. X     -bxxx     use an output file buffer of xxx kilobytes.
  325. X               (if 0, flush the file on every line - this is the default)
  326. X
  327. X               The -b option allows you to assign large buffers to the output
  328. X               file.  This reduces the amount of time spent writing to the
  329. X               disk and prevents unnecessary wear (especially for floppies). 
  330. X               If this parameter is zero, then as each scanline is finished,
  331. X               the line is written to the file and the file is flushed.  On
  332. X               most systems, this operation insures that the file is written
  333. X               to the disk so that in the event of a system crash or other
  334. X               catastrophic event, at least part of the picture has been
  335. X               stored properly on disk.
  336. X
  337. X
  338. X     -sxxx     start tracing at line number xxx.
  339. X     -exxx     end tracing at line number xxx.
  340. X
  341. X               The -s option is provided for when some natural or unnatural
  342. X               catastrophe has occurred, and you want to restart the trace at
  343. X               a given line number after the crash.  One is subtracted from
  344. X               the given line number if anti-aliasing is activated (the prior
  345. X               line's being computed is required for the anti-aliasing mech-
  346. X               anism to function properly).  It can also be used to re-render
  347. X               parts of an image (perhaps with anti-aliasing turned on).  A
  348. X               separate utility can then merge the new lines into the old
  349. X               file.  The particularly faint of heart or weak of power supply
  350. X               may want to batch the image in "strips" of 10-20 lines and
  351. X               concatenate them later.
  352. X
  353. X     -qx       rendering quality
  354. X
  355. X               The -q option allows you to specify the image rendering
  356. X               quality.  The parameter can range from 0 to 9.  The values
  357. X               correspond to the following quality levels:
  358. X
  359. X               0,1  Just show colours.  Ambient lighting only.
  360. X               2,3  Show Diffuse and Ambient light
  361. X               4,5  Render shadows
  362. X               6,7  Create surface textures
  363. X               8,9  Compute reflected, refracted, and transmitted rays.
  364. X
  365. X               The default is -q9 (maximum quality) if not specified.
  366. X
  367. X               You may specify the default parameters by modifying the file
  368. X               "trace.def" which contains the parameters in the above format. 
  369. X               This filename contains a complete command line as though you 
  370. X               had typed it in, and is processed before any options supplied
  371. X               on the command line are recognized.
  372. X
  373. X
  374. X
  375. X
  376. XSection 2 - The Object Description Language
  377. X
  378. X     The Object Description Language allows the user to describe the world in
  379. X     a readable and convenient way.
  380. X
  381. X     The language delimits comments by the left and right braces ({ and }). 
  382. X     Nested comments are allowed, but no sane person uses them anyway, right?
  383. X     
  384. X     The language allows include files to be specified by placing the line:
  385. X
  386. X     INCLUDE "filename"
  387. X
  388. X     at any point in the input file (Include files may be nested).
  389. X
  390. X
  391. XSection 2.1 - The Basic Data Types
  392. X
  393. X     There are several basic types of data:
  394. X
  395. X  Float
  396. X     Floats are represented by an optional sign (+ or -), some digits, an   
  397. X     optional decimal point, and more digits.  It does not support the "e"  
  398. X     notation for exponents.  The following are valid floats:
  399. X
  400. X     1.0  -2.0  -4  +34
  401. X
  402. X  Vector
  403. X     Vectors are arrays of three floats.  They are bracketed by angle
  404. X     brackets ( < and > ), and the three terms usually represent x, y, and z.
  405. X     For example:
  406. X
  407. X     < 1.0  3.2  -5.4578 >
  408. X
  409. X  Colour
  410. X     A colour consists of a red component, a green component, a blue
  411. X     component, and possibly an alpha component.  All four components are
  412. X     floats in the range 0.0 to 1.0.  The syntax for Colours is the word
  413. X     "COLOUR" followed by any or all of the RED, GREEN, BLUE or ALPHA
  414. X     components in any order.
  415. X
  416. X     For example:
  417. X
  418. X     COLOUR  RED 1.0  GREEN 1.0  BLUE 1.0
  419. X     COLOUR  BLUE 0.56
  420. X     COLOUR  GREEN 0.45 RED 0.3 ALPHA 0.3
  421. X
  422. X     Alpha is a transparency indicator.  If an object's colour contains some 
  423. X     transparency, then you can see through it.  If Alpha is 0.0, the object 
  424. X     is totally opaque.  If it is 1.0, it is totally transparent.
  425. X
  426. X     For those people who spell "Colour" the American way as "Color", the   
  427. X     program also accepts "COLOR" as equivalent to "COLOUR" in all instances.
  428. X
  429. X  COLOUR_MAP
  430. X     For wood, marble, spotted, agate, granite, and gradient texturing, the
  431. X     user may specify arbitrary colours to use for the texture.  This is done
  432. X     by a colour map or "colour spline".  When the object is being textured,
  433. X     a number between 0.0 and 1.0 is generated which is then used to form the
  434. X     colour of the point.  A Colour map specifies the mapping used to change
  435. X     these numbers into colours.  The syntax is as follows:
  436. X
  437. X     COLOUR_MAP
  438. X          [start_value end_value colour1 colour2]
  439. X          [start_value end_value colour1 colour2]
  440. X          ...
  441. X     END_COLOUR_MAP
  442. X
  443. X     The value is located in the colour map and the final colour is
  444. X     calculated by a linear interpolation between the two colours in the
  445. X     located range.
  446. X
  447. XSection 2.2 - The More Complex Data Types
  448. X
  449. X     The data types used to describe the objects in the world are a bit more 
  450. X     difficult to describe.  To make this task easier, the program allows
  451. X     users to describe these types in two ways.  The first way is to define
  452. X     it from first principles specifying all of the required parameters.  The
  453. X     second way allows the user to define an object as a modification of
  454. X     another object (the other object is usually defined from first
  455. X     principles but is much simpler).  Here's how it works:
  456. X
  457. X     You can use the term DECLARE to declare a type of object with a certain 
  458. X     description.  The object is not included in the world but it can be used
  459. X     as a "prototype" for defining other objects, as this basic example
  460. X     shows:
  461. X
  462. X     DECLARE Sphere = QUADRIC
  463. X          <1.0 1.0 1.0>
  464. X          <0.0 0.0 0.0>
  465. X          <0.0 0.0 0.0>
  466. X          -1.0
  467. X     END_QUADRIC
  468. X
  469. X     To then reference the declaration elsewhere in your source file or in
  470. X     another included one, and to actually include the object in the world,
  471. X     you would define the object using object definition syntax, like this:
  472. X
  473. X     OBJECT
  474. X          QUADRIC Sphere
  475. X               SCALE <20.0 20.0 20.0>
  476. X          END_QUADRIC
  477. X          COLOUR White
  478. X          AMBIENT 0.2
  479. X          DIFFUSE 0.8
  480. X     END_OBJECT
  481. X     The real power of declaration becomes apparent when you declare several
  482. X     primitive types of objects and then define an object with several
  483. X     component shapes, using either COMPOSITE methods or the CSG methods
  484. X     INTERSECTION, UNION, or DIFFERENCE.  More on those later.  Also, using
  485. X     the DECLARE keyword can make several objects share a texture without the
  486. X     need for each object to store a duplicate copy of the same texture, for
  487. X     more efficient memory usage.   Example:
  488. X     OBJECT         { A Hot dog in a Hamburger Bun (?) }
  489. X          UNION
  490. X               QUADRIC Sphere
  491. X                    SCALE <20.0, 10.0, 20.0>
  492. X               END_QUADRIC
  493. X               QUADRIC Cylinder_X
  494. X                    SCALE <40.0, 20.0, 20.0>
  495. X               END_QUADRIC
  496. X          END_UNION
  497. X     END_OBJECT
  498. X
  499. X
  500. X  Viewpoint
  501. X     The viewpoint tells the ray tracer the location and orientation of the 
  502. X     camera.  The viewpoint is described by four vectors - Location,
  503. X     Direction, Up, and Right.  Location determines where the camera is
  504. X     located.  Direction  determines the direction that the camera is
  505. X     pointed.  Up determines the "up" direction of the camera.  Right
  506. X     determines the direction to the right of the camera.
  507. X
  508. X     A first principle's declaration of a viewpoint would look like this:   
  509. X     
  510. X     VIEWPOINT
  511. X          LOCATION < 0.0  0.0  0.0>
  512. X          DIRECTION < 0.0  0.0  1.0>
  513. X          UP < 0.0  1.0  0.0 >
  514. X          RIGHT < 1.0  0.0  0.0>
  515. X     END_VIEWPOINT
  516. X
  517. X     This format becomes cumbersome, however, because the vectors must be   
  518. X     calculated by hand.  This is especially difficult when the vectors are
  519. X     not lined up with the X, Y, and Z axes as they are in the above example. 
  520. X     To make it easier to define the viewpoint, you can define one viewpoint,
  521. X     then modify the description.  For example,
  522. X
  523. X     VIEWPOINT
  524. X          LOCATION < 0.0  0.0  0.0>
  525. X          DIRECTION < 0.0  0.0  1.0>
  526. X          UP < 0.0  1.0  0.0 >
  527. X          RIGHT < 1.0  0.0  0.0 >
  528. X          TRANSLATE < 5.0  3.0  4.0 >
  529. X          ROTATE < 30.0  60.0  30.0 >
  530. X     END_VIEWPOINT
  531. X
  532. X     In this example, the viewpoint is created, then translated to another
  533. X     point in space and rotated by 30 degrees about the X axis, 60 degrees
  534. X     about the Y axis, and 30 degrees about the Z axis.
  535. X
  536. X     Unfortunately, even this is somewhat cumbersome.  So, in version 2.0,
  537. X     you can now specify two more parameters:
  538. X
  539. X          SKY <vector>
  540. X          LOOK_AT <vector>
  541. X
  542. X     The SKY keyword tells the viewpoint where the sky is.  It tries to keep 
  543. X     the camera's UP direction aligned as closely as possible to the sky. 
  544. X     The LOOK_AT keyword tells the camera to look at a specific point.  The
  545. X     camera is rotated as required to point directly at that point.  By
  546. X     changing the  SKY vector, you can twist the camera while still looking
  547. X     at the same point.
  548. X
  549. X     Note that a pinhole camera model is used, so no focus or depth-of-field 
  550. X     effects are supported at this time.
  551. X   
  552. X
  553. X     Version 2.0 of the raytracer includes the ability to render fog.  To add 
  554. X     fog to a scene, place the following declaration outside of any object  
  555. X     definitions:
  556. X
  557. X     FOG
  558. X          COLOUR  ... the fog colour
  559. X          200.0   ... the fog distance
  560. X     END_FOG
  561. X
  562. X  Shapes
  563. X     Shapes describe the shape of an object without mentioning any surface  
  564. X     characteristics like colour, lighting and reflectivity.  The most
  565. X     general shape used by this system is called a Quadric Surface.  Quadric
  566. X     Surfaces can produce shapes like spheres, cones, and cylinders.  The
  567. X     easiest way to define these shapes is to include the standard file
  568. X     "BasicShapes.data" into your program and to transform these shapes
  569. X     (using TRANSLATE, ROTATE, and SCALE) into the ones you want.  To be
  570. X     complete, however, I will describe the mathematical principles behind
  571. X     quadric surfaces.  Those who are not interested in the mathematical
  572. X     details can skip to the next section.
  573. X
  574. X     A quadric surface is a surface in three dimensions which satisfies the 
  575. X     following equation:
  576. X
  577. X
  578. X     A y**2  + B y**2  + C z**2
  579. X     + D xy    + E xz    + F yz
  580. X     + G x     + H y     + I z    + J = 0
  581. X
  582. X
  583. X     (Did you really want to know that?  I didn't think so. :-)  DKB)
  584. X
  585. X     Different values of A,B,C,...J will give different shapes.  So, if you
  586. X     take any three dimensional point and use its x, y, and z coordinates in
  587. X     the above equation, the answer will be 0 if the point is on the surface
  588. X     of the object.  The answer will be negative if the point is inside the
  589. X     object and positive if the point is outside the object.  Here are some
  590. X     examples:
  591. X
  592. X     X**2 + Y**2 + Z**2 - 1 = 0     Sphere
  593. X     X**2 + Y**2 - 1 = 0            Cylinder along the Z axis
  594. X     X**2 + Y**2 + Z = 0            Cone along the Z axis
  595. X
  596. X     General quadric surfaces can be defined as follows:
  597. X
  598. X     QUADRIC
  599. X          < A B C >
  600. X          < D E F >
  601. X          < G H I >
  602. X          J
  603. X     END_QUADRIC
  604. X
  605. X
  606. XSection 2.3 - Quadric surfaces the easy way
  607. X
  608. X     Now that doesn't sound so hard, does it?  Well, actually, it does.  Only 
  609. X     the hard-core graphics fanatic would define his objects using the
  610. X     QUADRIC definition directly.  Even I don't do it that way and I know how
  611. X     it works (Well, at least I worked it out once or twice :-) - DKB).
  612. X
  613. X     Fortunately, there is an easier way. The file "BasicShapes.data" already
  614. X     includes the definitions of many quadric surfaces.  They are centered
  615. X     about the origin (0,0,0) and have a radius of 1.  To use them, you can
  616. X     define shapes as follows:
  617. X
  618. X
  619. X     INCLUDE "BasicShapes.data"
  620. X
  621. X     QUADRIC
  622. X          Cylinder_X
  623. X          SCALE < 50.0  50.0  50.0 >
  624. X          ROTATE < 30.0  10.0  45.0 >
  625. X          TRANSLATE < 2.0  5.0  6.0 >
  626. X     END_QUADRIC
  627. X
  628. X
  629. X     You may have as many transformation lines (scale, rotate, and translate)
  630. X     as you like in any order.  Usually, however, it's easiest to do a scale
  631. X     first, one or more rotations, then finally a translation.  Otherwise,
  632. X     the results may not be what you expect. (The transformations always
  633. X     transform the object about the origin.  If you have a sphere at the
  634. X     origin and you translate it then rotate it, the rotation will spin the
  635. X     sphere around the origin like planets about the sun).
  636. X
  637. X
  638. X
  639. XSection  2.4 - Spheres
  640. X
  641. X     Since spheres are so common in ray traced graphics, A SPHERE primitive
  642. X     has been added to the system.  This primitive will render much more
  643. X     quickly than the corresponding quadric shape.  The syntax is:
  644. X      
  645. X     SPHERE  <center> radius END_SPHERE
  646. X
  647. X     You can also add translations, rotations, and scaling to the sphere. 
  648. X     For example, the following two objects are identical:
  649. X
  650. X     OBJECT
  651. X          SPHERE  < 0.0 25.0 0.0 > 10.0 END_SPHERE
  652. X          COLOR Blue
  653. X          AMBIENT 0.3
  654. X          DIFFUSE 0.7
  655. X     END_OBJECT
  656. X
  657. X     OBJECT
  658. X          SPHERE  < 0.0 0.0 0.0 > 1.0
  659. X               TRANSLATE <0.0  25.0  0.0> 
  660. X               SCALE <10.0  10.0  10.0>
  661. X          END_SPHERE
  662. X          COLOR Blue
  663. X          AMBIENT 0.3
  664. X          DIFFUSE 0.7
  665. X     END_OBJECT
  666. X
  667. X     Note that Spheres may only be scaled uniformly. You cannot use:
  668. X
  669. X     SCALE <10.0 5.0 2.0>
  670. X
  671. X     on a sphere.  If you need oblate spheroids such as this, use a scaled
  672. X     quadric "Sphere" shape instead.
  673. X
  674. XSection  2.5 - Planes
  675. X
  676. X     Another primitive provided to speed up the raytracing is the PLANE. 
  677. X     This is a flat infinite plane.  To declare a PLANE, you specify the
  678. X     direction of the surface normal to the plane (the UP direction) and the
  679. X     distance from the origin of the plane to the world's origin.  As with
  680. X     spheres, you can translate, rotate, and scale planes.  Examples:
  681. X
  682. X     PLANE <0.0  1.0  0.0> -10.0 END_PLANE   { A plane in the X-Z axes 10
  683. X                                             units below the world origin. }
  684. X
  685. X     PLANE <0.0  1.0  0.0>  10.0 END_PLANE   { A plane in the X-Z axes 10
  686. X                                             units above the world origin. }
  687. X
  688. X     PLANE <0.0  0.0  1.0>  -10.0 END_PLANE  { A plane in the X-Y axes 10
  689. X                                             units behind the world origin.}
  690. X
  691. X
  692. XSection  2.6 - Triangles
  693. X
  694. X     In order to make more complex objects than the class of quadrics will
  695. X     permit, a new primitive shape for triangles has been added.  There are
  696. X     two different types of triangles:  flat shaded triangles and smooth
  697. X     shaded (Phong) triangles.
  698. X
  699. X     Flat shaded triangles are defined by listing the three vertices of the 
  700. X     triangle.  For example:
  701. X   
  702. X     TRIANGLE  < 0.0   20.0  0.0>
  703. X               < 20.0  0.0   0.0>
  704. X               <-20.0  0.0   0.0>
  705. X     END_TRIANGLE
  706. X
  707. X     The smooth shaded triangles use Phong Normal Interpolation to calculate
  708. X     the surface normal for the triangle.  This makes the triangle appear to
  709. X     be a smooth curved surface.  In order to define a smooth triangle,
  710. X     however, you must supply not only the vertices, but also the surface
  711. X     normals at those vertices.  For example:
  712. X   
  713. X     SMOOTH_TRIANGLE
  714. X          {      points             surface normals     }
  715. X          <  0.0  30.0  0.0 >    <0.0   0.7071   -0.7071>
  716. X          < 40.0 -20.0  0.0 >    <0.0   -0.8664  -0.5   >
  717. X          <-50.0 -30.0  0.0 >    <0.0   -0.5     -0.8664>
  718. X     END_SMOOTH_TRIANGLE
  719. X
  720. X     As with the other shapes, triangles can be translated, rotated, and
  721. X     scaled.
  722. X
  723. X     NOTE:  Triangles cannot be used in CSG INTERSECTION or DIFFERENCE types
  724. X     (described next) since triangles have no clear "inside".  The CSG UNION
  725. X     type works acceptably but with no difference from a COMPOSITE object.
  726. X
  727. X
  728. XSection 2.7 - Constructive Solid Geometry (CSG)
  729. X
  730. X     This ray tracer supports Constructive Solid Geometry in order to make
  731. X     the object definition abilities more powerful.  Constructive Solid
  732. X     Geometry allows you to define shapes which are the union, intersection,
  733. X     or difference of other shapes.  Unions superimpose the two shapes.  This
  734. X     has the same effect as defining two separate objects, but is simpler to
  735. X     create and/or manipulate.  Intersections define the space where the two
  736. X     surfaces meet.  Differences allow you to cut one object out of another.
  737. X
  738. X
  739. X
  740. X
  741. X
  742. X
  743. X
  744. X
  745. X     CSG Intersections, Unions, and Differences can consist of two or more
  746. X     shapes.  They are defined as follows:
  747. X
  748. X     OBJECT
  749. X          INTERSECTION
  750. X               QUADRIC
  751. X                    ...
  752. X               END_QUADRIC
  753. X
  754. X               QUADRIC
  755. X                    ...
  756. X               END_QUADRIC
  757. X
  758. X               QUADRIC
  759. X                    ...
  760. X               END_QUADRIC
  761. X          END_INTERSECTION
  762. X          ...
  763. X     END_OBJECT
  764. X
  765. X     UNION or DIFFERENCE may be used instead of INTERSECTION.  The order of
  766. X     the shapes doesn't matter except for the DIFFERENCE shapes.  For CSG
  767. X     differences, the first shape is visible and the remaining shapes are cut
  768. X     out of the first (in reverse order from version 1.2 DIFFERENCE's).
  769. X
  770. X     Constructive solid geometry shapes may be translated, rotated, or scaled
  771. X     in the same way as a Quadric surface.  The quadric surfaces making up
  772. X     the CSG object may be individually translated, rotated, and scaled as
  773. X     well.
  774. X
  775. X     When using CSG, it is often useful to invert an shape so that it's
  776. X     inside-out.  The INVERSE keyword can be used to do this for any SPHERE,
  777. X     PLANE, or QUADRIC.  When INVERSE is used, the "inside" of the object is
  778. X     flipped to be the "outside".  For Planes, "inside" is defined to be "in
  779. X     the opposite direction to the "normal" or "up" direction.
  780. X
  781. X     Note that performing an INTERSECTION between an shape and some other
  782. X     INVERSE shapes is the same as performing a DIFFERENCE.  In fact, the
  783. X     DIFFERENCE is actually implemented in this way.
  784. X
  785. XSection  2.8 - Objects
  786. X
  787. X     There is more to defining an object than just its shape.  You must tell
  788. X     the ray tracer about the properties of the surface like colour, alpha,
  789. X     reflectivity, refractivity, the index of refraction, and so on. To do
  790. X     this, you must define Objects.
  791. X
  792. X
  793. X
  794. X
  795. X
  796. X
  797. X
  798. X     A typical object definition looks something like this:
  799. X
  800. X     OBJECT
  801. X          QUADRIC Sphere
  802. X               TRANSLATE < 40.0 40.0 60.0 >
  803. X          END_QUADRIC
  804. X
  805. X          TEXTURE
  806. X               0.05
  807. X          END_TEXTURE
  808. X
  809. X          AMBIENT  0.3
  810. X          DIFFUSE   0.7
  811. X          REFLECTION  0.3
  812. X          REFRACTION  0.3
  813. X          IOR 1.05
  814. X          COLOUR RED 1.0 GREEN 1.0 BLUE 1.0 ALPHA 0.5
  815. X     END_OBJECT
  816. X
  817. X     The following keywords may be used when defining objects:
  818. X
  819. X     AMBIENT value
  820. X     -    Ambient light is light that is scattered everywhere in the room. 
  821. X          An object lit only by ambient light will appear to have the same
  822. X          brightness over the entire surface.  The default value is very
  823. X          little ambient light (0.3).  The value can range from 0.0 to 1.0.
  824. X
  825. X     DIFFUSE value
  826. X     -    Diffuse light is light coming from a light source that is scattered
  827. X          in all directions.  An object lit only by diffuse light looks like
  828. X          a rubber ball with a spot light shining on it.  The value can range
  829. X          from 0.0 to 1.0.  By default, there is mostly diffuse lighting
  830. X          (0.7).
  831. X
  832. X     BRILLIANCE value
  833. X     -    Objects can be made to appear more metallic by increasing their
  834. X          brilliance.  This controls the tightness of the basic diffuse
  835. X          illumination on objects and minorly adjusts the appearance of
  836. X          surface shininess.  The default value is 1.0.  Higher values from
  837. X          3.0 to about 10.0 can give objects a somewhat more shiny or
  838. X          metallic appearance.  This is best used in concert with either
  839. X          SPECULAR or PHONG highlighting.
  840. X
  841. X     REFLECTION value
  842. X     -    By setting the reflection value to be non-zero, you can give the
  843. X          object a mirrored finish.  It will reflect all other objects in the
  844. X          room.  The value can range from 0.0 to 1.0.  By default there is no
  845. X          reflection.
  846. X
  847. X
  848. X
  849. X
  850. X
  851. X     REFRACTION value
  852. X     -    By setting the refraction value to be non-zero, the object is made
  853. X          transparent.  Light will be refracted through the object like a
  854. X          lens.  The value can be set between 0.0 and 1.0.  There is no
  855. X          refraction by default.
  856. X     IOR value
  857. X     -    If the object is refracting light, then the IOR or Index of
  858. X          Refraction should be set.  This determines how dense the object is.
  859. X          A value of 1.0 will give no refraction.  The Index of Refraction
  860. X          for Air is 1.0, Water is 1.33, glass is 1.5, and diamond is 2.4.
  861. X
  862. X     PHONG value
  863. X     -    Controls the amount of Phong Specular Reflection highlighting on
  864. X          the object.  Causes bright shiny spots on the object, the colour of
  865. X          the light source that is being reflected.  The size of the spot is
  866. X          defined by the value given for PHONGSIZE below.  PHONG's value is
  867. X          typically from 0.0 to 1.0, where 1.0 causes complete saturation of
  868. X          the object's colour to the light source's colour at the brightest
  869. X          area (center) of the highlight.  There is no PHONG highlighting
  870. X          given by default.
  871. X
  872. X     PHONGSIZE value
  873. X     -    Controls the size of the PHONG Highlight on the object, sort of an
  874. X          arbitrary "glossiness" factor.  Values range from 1.0 (Very Dull)
  875. X          to 100 (Highly Polished).  Default PHONGSIZE is 40 (plastic?) if
  876. X          not specified.  This is simulating the fact that slightly reflect-
  877. X          ive objects, especially metallic ones, have microscopic facets,
  878. X          some of which are facing in the mirror direction.  The more that
  879. X          are facing that way, the shinier the object appears, and the
  880. X          tighter the specular highlights become.  Phong measures the average
  881. X          of facets facing in the mirror direction from the light sources to
  882. X          the viewer.
  883. X
  884. X     SPECULAR value
  885. X     -    Very similar to PHONG Specular Highlighting, but a better model is 
  886. X          used for determining light ray/object intersection, so a more
  887. X          credible spreading of the highlights occur near the object
  888. X          horizons, supposedly.  PHONG is thus included for mostly academic
  889. X          reasons, but try them both and you decide which you like better.
  890. X          This effect is most obvious for light sources behind objects.  The
  891. X          size of the spot is defined by the value given for ROUGHNESS below. 
  892. X          Like PHONG, SPECULAR values are typically from 0.0 to 1.0 for full
  893. X          saturation.  Default is no SPECULAR highlighting.
  894. X
  895. X     ROUGHNESS value
  896. X     -    Controls the size of the SPECULAR Highlight on the object, relative
  897. X          to the object's "roughness".  Values range from 1.0 (Very Rough) to
  898. X          0.001 (Very Smooth).  The default value if not specified is 0.05
  899. X          (Plastic?).  The roughness or average directional distribution of
  900. X          the microfacets is facing in the same direction as the perpen-
  901. X          dicular surface "normal" cause the most notable reflection of the
  902. X          highlight to the observer.
  903. X
  904. X     COLOUR value
  905. X     -    The colour of an object can be set by using this option.  The value
  906. X          is a colour or a colour constant.  For example:
  907. X
  908. X     COLOUR RED 1.0  BLUE 0.4
  909. X
  910. X          - or -
  911. X
  912. X     DECLARE Yellow = COLOUR RED 1.0 GREEN 1.0
  913. X          ...
  914. X     COLOUR Yellow
  915. X
  916. X
  917. X     TRANSLATE vector
  918. X     ROTATE vector
  919. X     SCALE vector
  920. X     -    Objects can be translated, rotated, and scaled just like surfaces.
  921. X          This feature is included for consistency.
  922. X
  923. X     LIGHT_SOURCE
  924. X     -    If the LIGHT_SOURCE keyword is used in the definition of an object,
  925. X          then the object is included in the list of light sources.  It can
  926. X          light objects and produce shadows.  (You should also specify the
  927. X          COLOUR of the light source).  Light sources have a peculiar re-
  928. X          striction:  The light source MUST be TRANSLATED to it's final
  929. X          position in the scene, so the normal way to define a light source
  930. X          is a sphere or quadric centered about the origin, then TRANSLATED
  931. X          to where desired in the final scene.  For example:
  932. X
  933. X     OBJECT
  934. X          SPHERE <0.0  0.0  0.0> 2.0 END_SPHERE   {could be a quadric, too.}
  935. X          TRANSLATE <100.0  120.0  40.0>
  936. X
  937. X          LIGHT_SOURCE
  938. X          COLOUR RED 1.0 GREEN 1.0 BLUE 1.0
  939. X          AMBIENT 1.0
  940. X          DIFFUSE 0.0
  941. X     END_OBJECT
  942. X
  943. X
  944. X     TEXTURE
  945. X     -    The texture feature is an experiment into functionally based
  946. X          modelling.  This feature allows you to assign more interesting
  947. X          colouring schemes to objects.  Many procedural surface textures are
  948. X          provided, and by using different colour maps with them, nearly
  949. X          infinite permutations are possible.  For example, you can make some
  950. X          object look like wood or marble, etc.
  951. X
  952. X
  953. X
  954. X
  955. X
  956. X
  957. X     The basic TEXTURE syntax is as follows:
  958. X
  959. X     TEXTURE
  960. X          0.05
  961. X          WOOD
  962. X          TURBULENCE 0.2
  963. X          TRANSLATE < 1.0 2.0 3.0 >
  964. X          ROTATE < 0.0 10.0 40.0 >
  965. X          SCALE < 10.0 10.0 10.0 >
  966. X     END_TEXTURE
  967. X
  968. X     The transformations are optional.  They allow you to transform the
  969. X     texture independent of the object itself.  If you are doing animation,
  970. X     then the transformations should be the same as the object
  971. X     transformations so that  the texture follows the object.
  972. X
  973. X     The floating-point value given immediately following the texture keyword
  974. X     is an optional "texture randomness" value, which causes a minor random
  975. X     scattering of calculated colour values and produces a sort of "dithered" 
  976. X     appearance.
  977. X
  978. X     Instead of using WOOD, you may use MARBLE, BOZO, CHECKER, or a handful
  979. X     of other interesting textures.  The WOOD and MARBLE textures are
  980. X     perturbed by a turbulence function.  This makes them look more random
  981. X     and irregular than they would normally appear.  The amount of turbulence
  982. X     can be changed by the TURBULENCE keyword followed by a number.  Values
  983. X     from 0.1 to 0.3 seem to give the best results.  The default is 0.0, or
  984. X     no turbulence.
  985. X
  986. X     Note some of the textures given are coloration textures, such as MARBLE,
  987. X     WOOD CHECKER, GRANITE, and AGATE.  These work with colour maps, and have
  988. X     default "colour maps" they resort to if none are given.  The rest of the
  989. X     textures available are "surface perturbation" textures, and do not dir-
  990. X     ectly affect the colour of the object, but rather the surface's apparent
  991. X     orientation in space. Examples of this are WAVES, RIPPLES, DENTS, BUMPS,
  992. X     and WRINKLES.  Note that any given texture may include up to two actual
  993. X     textures, one coloration and one surface perturbation choice per
  994. X     texture.  This would allow rippled wood, or dented granite combinations, 
  995. X     etc., but keep in mind that any transformations applied to one texture
  996. X     (i.e. TRANSLATE or SCALE) will also transform the other one in the same
  997. X     fashion.
  998. X
  999. X
  1000. X     The following textures are available:
  1001. X
  1002. X     CHECKER texturing gives a checker-board appearance.  This option works
  1003. X     best on planes.  When using the CHECKER texturing, you must specify two
  1004. X     colours immediately following the word CHECKER.  These colours are the
  1005. X     colours of alternate squares in the checker pattern.  The default
  1006. X     orientation of the CHECKER texture is on an X-Z plane (good for ground
  1007. X     work, etc.) but to use it on an object which has mostly X-Y orientation
  1008. X     (such as a sphere, for instance), you must ROTATE the texture.
  1009. X
  1010. X     To rotate the CHECKER texture onto an X-Y plane:
  1011. X
  1012. X     TEXTURE
  1013. X          CHECKER COLOUR White COLOUR Red
  1014. X          SCALE <10.0 10.0 10.0>
  1015. X          ROTATE <-90.0 0.0 0.0>   { Checkers now in the X-Y plane... }
  1016. X     END_TEXTURE
  1017. X
  1018. X     As mentioned above, for coloration textures such as WOOD, MARBLE, and
  1019. X     BOZO, etc., you may change the colouring scheme by using a colour map.
  1020. X     This map allows you to convert numbers from 0.0 to 1.0 (which are
  1021. X     generated by the ray tracer) into ranges of colours. For example, the
  1022. X     default BOZO colouring can be specified by:
  1023. X
  1024. X     TEXTURE
  1025. X          BOZO
  1026. X          COLOUR_MAP
  1027. X               [0.0 0.4 COLOUR White COLOUR White]
  1028. X               [0.4 0.6 COLOUR Green COLOUR Green]
  1029. X               [0.6 0.8 COLOUR Blue COLOUR Blue]
  1030. X               [0.8 1.0 COLOUR Red COLOUR Red]
  1031. X          END_COLOUR_MAP
  1032. X     END_TEXTURE
  1033. X
  1034. X     BOZO texture basically takes a noise function and maps it onto the
  1035. X     surface of an object.  This "noise" is defined for every point in space.
  1036. X     If two points are close together, they will have noise values that are
  1037. X     close together.  If they are far apart, their noise values will be
  1038. X     fairly random relative to each other.
  1039. X
  1040. X     The easiest way to see how it works is to try it.  With a good choice of
  1041. X     colours it produces some of the most realistic looking cloudscapes you
  1042. X     have ever seen.  Try a cloud color map such as:
  1043. X
  1044. X     TEXTURE
  1045. X          BOZO
  1046. X          TURBULENCE 1.0      { A blustery day.  For a calmer one, try 0.2 }
  1047. X          COLOUR_MAP
  1048. X               [0.0 0.5  COLOUR RED 0.5 GREEN 0.5 BLUE 1.0  {blue to blue}
  1049. X                    COLOUR RED 0.5 GREEN 0.5 BLUE 1.0]
  1050. X               [0.5 0.6  COLOUR RED 0.5 GREEN 0.5 BLUE 1.0  {blue to white}
  1051. X                    COLOUR RED 1.0 GREEN 1.0 BLUE 1.0]
  1052. X               [0.6 1.001 COLOUR RED 1.0 GREEN 1.0 BLUE 1.0 {white to grey}
  1053. X                    COLOUR RED 0.5 GREEN 0.5 BLUE 0.5]
  1054. X          END_COLOUR_MAP
  1055. X          SCALE <800.0 800.0 800.0>
  1056. X          TRANSLATE <200.0 400.0 100.0>
  1057. X     END_TEXTURE
  1058. X
  1059. X     (Check out sunset.dat for a really neat (but slow) sky pattern)
  1060. X
  1061. X
  1062. X
  1063. X     The color map above indicates that for small values of texture, use a
  1064. X     sky blue color solidly until about halfway turbulent, then fade through
  1065. X     to white on a fairly narrow range.  As the white clouds get more turb-
  1066. X     ulent and solid towards the center, pull the color map toward grey to
  1067. X     give them the appearance of holding water vapor (like typical clouds).
  1068. X     SPOTTED - Spotted texture is a sort of swirled random spotting of the
  1069. X     colour of the object.  If you've ever seen a metal organ pipe you know
  1070. X     about what it looks like (a galvanized garbage can is close...)  Play
  1071. X     with this one, it might render a decent cloudscape during a very stormy 
  1072. X     day (?).  No extra keywords are required.  Should work with colour maps.
  1073. X     With small scaling values, looks like masonry or concrete.
  1074. X
  1075. X     AGATE - this texture is similar to Marble, but uses a different turb-
  1076. X     ulence function.  The TURBULENCE keyword has no effect, and as such it
  1077. X     is always very turbulent.
  1078. X
  1079. X     GRADIENT - this is a specialized texture that uses approximate local
  1080. X     coordinates of an object to control colour map gradients.  This texture
  1081. X     ONLY works with colour maps (one MUST be given!) and has a special <X,
  1082. X     Y, Z> triple given after the GRADIENT keyword, which specifies any (or
  1083. X     all) axes to perform the gradient action on.  (Example: a Y gradient
  1084. X     <0.0, 1.0, 0.0> will give an "altitude colour map", along the Y axis).
  1085. X     Values other than 0.0 are taken as 1.0 and others are meaningless.  For
  1086. X     smooth repeating gradients, you should use a nearly "circular" colour
  1087. X     map, that is, one in which the first colour value (0.0) is the same as
  1088. X     the last one (1.001) so it "wraps around" and will cause smooth
  1089. X     repeating gradient patterns.  Scaling the texture is normally required
  1090. X     to achieve the number of repeating shade cycles you want. 
  1091. X     Transformation of the texture is useful to prevent a "mirroring" effect
  1092. X     from either side of the central 0 axes.  Here is an example of a
  1093. X     gradient texture which uses a sharp "circular" color mapped gradient
  1094. X     rather than a smooth one, and uses both X and Y gradients to get a
  1095. X     diagonally-oriented gradient.  It produces a dandy candy cane texture!
  1096. X
  1097. X     TEXTURE
  1098. X          GRADIENT < 1.0 1.0 0.0 >
  1099. X          COLOUR_MAP
  1100. X               [0.00 0.25  COLOUR RED 1.0 GREEN 0.0 BLUE 0.0
  1101. X                    COLOUR RED 1.0 GREEN 0.0 BLUE 0.0]
  1102. X               [0.25 0.75  COLOUR RED 1.0 GREEN 1.0 BLUE 1.0
  1103. X                    COLOUR RED 1.0 GREEN 1.0 BLUE 1.0]
  1104. X               [0.75 1.001 COLOUR RED 1.0 GREEN 0.0 BLUE 0.0
  1105. X                    COLOUR RED 1.0 GREEN 0.0 BLUE 0.0]
  1106. X          END_COLOUR_MAP
  1107. X          SCALE <30.0 30.0 30.0>
  1108. X          TRANSLATE <30.0 -30.0 0.0>
  1109. X     END_TEXTURE
  1110. X
  1111. X
  1112. X     You may also specify a TURBULENCE value with the gradient to give a    
  1113. X     more irregular colour gradient.  This may help to do neat things like
  1114. X     fire or coronas.
  1115. X
  1116. X     GRANITE - A colouring texture.  This uses a simple 1/f fractal noise
  1117. X     function to give a pretty darn good grey granite texture.  Typically
  1118. X     used with small scaling values (2.0 to 5.0).  Also looks good with a
  1119. X     little dithering (texture randomness).  Should work with colour maps, so
  1120. X     try your hand at pink granite or alabaster!
  1121. X
  1122. X     RIPPLES - As mentioned above, you may optionally specify a surface
  1123. X     perturbation texture which can be used in conjunction with the above
  1124. X     coloration textures.  RIPPLES is one example of a surface perturbation
  1125. X     texture.  This texture makes the surface look like ripples of water. 
  1126. X     The RIPPLES option requires a value to determine how deep the ripples
  1127. X     are:
  1128. X
  1129. X     TEXTURE
  1130. X          WOOD
  1131. X          RIPPLES 0.3
  1132. X          TRANSLATE < 1.0 2.0 3.0 >
  1133. X          ROTATE < 0.0 10.0 40.0 >
  1134. X          SCALE < 10.0 10.0 10.0 >
  1135. X     END_TEXTURE
  1136. X
  1137. X     (In this case, the WOOD, MARBLE, or BOZO, etc. keywords are optional).
  1138. X     If a different colouring is specified (WOOD, MARBLE, or BOZO), then the
  1139. X     COLOUR parameter is ignored (except for light sources where it gives the
  1140. X     light colour or when rendering with a low -q option).
  1141. X
  1142. X     WAVES - Another option that you may want to experiment with is called
  1143. X     WAVES. This works in a similar way to RIPPLES except that it makes waves
  1144. X     with different frequencies.  The effect is to make waves that look more
  1145. X     like deep ocean waves. (I haven't done much testing on WAVES, so I can't
  1146. X     guarantee that it works very well).
  1147. X
  1148. X     Both WAVES and RIPPLES respond to a texturing option called PHASE. The
  1149. X     PHASE option allows you to create animations in which the water seems to
  1150. X     move.  This is done by making the PHASE increment slowly between frames. 
  1151. X     The range from 0.0 to 1.0 gives one complete cycle of a wave.
  1152. X
  1153. X     BUMPS - Approximately the same turbulence function as SPOTTED, but uses
  1154. X     the derived value to perturb the surface normal.  This gives the
  1155. X     impression of a "bumpy" surface, random and irregular, sort of like an
  1156. X     orange.  After the BUMPS keyword, supply a single floating point value
  1157. X     for the amount of surface perturbation.  Values typically range from 0.0
  1158. X     (No Bumps) to 1.0 (Extremely Bumpy).  Values beyond 1.0 may do wierd
  1159. X     things.
  1160. X
  1161. X     DENTS - Also a surface normal perturbing texture.  Interesting when used
  1162. X     with metallic textures, it gives impressions into the metal surface that
  1163. X     look like dents.  A single value is supplied after the DENTS keyword to
  1164. X     indicate the amount of denting required.  Values range from 0.0 (No
  1165. X     Dents) to 1.0 (Fairly Dented).  Use larger values at your own risk...
  1166. X     Scale the texture to make the pitting more or less frequent.
  1167. X
  1168. X
  1169. X     WRINKLES - This is sort of a 3-D (normal perturbing) GRANITE.  It uses
  1170. X     a similar 1/f fractal noise function to perturb the surface normal in 3D
  1171. X     space.  With ALPHA values of greater than 0.0, could look like wrinkled
  1172. X     cellophane.  Requires a single value after the WRINKLES keyword to
  1173. X     indicate the amount of wrinkling desired.  Values from 0.0 (No Wrinkles)
  1174. X     to 1.0 (Very Wrinkled) are typical.
  1175. X
  1176. X
  1177. X     IMAGEMAP - This is a very special coloration texture that allows you to
  1178. X     import a bitmapped file in RAW format (the format output by the ray-
  1179. X     tracer), IFF format or Compuserve GIF format and map that bitmap onto an
  1180. X     object.  In the texture of an object, you must give the IMAGEMAP key-
  1181. X     word, the format, and a file name.  The syntax is:          
  1182. X
  1183. X          IMAGEMAP [gradient] RAW "filename [ONCE]"
  1184. X     or   IMAGEMAP [gradient] IFF "filename [ONCE]"
  1185. X     or   IMAGEMAP [gradient] GIF "filename [ONCE]"
  1186. X
  1187. X     The texture will then be mapped onto the object as a repeating pattern.
  1188. X     The ONCE keyword places only one image onto the object instead of an
  1189. X     infinitely repeating tiled pattern.  When ONCE is used, the object's
  1190. X     default colour is used as the colour outside of the image.
  1191. X
  1192. X
  1193. X     By default, the image is mapped onto the XY plane in the range (0.0,
  1194. X     0.0) to (1.0, 1.0).  If you would like to change this default, you may
  1195. X     use an optional gradient <x, y, z> vector after the word IMAGEMAP.  This
  1196. X     vector indicates which axes are to be used as the u and v (local surface
  1197. X     X-Y) axes. The vector should contain one positive number and one
  1198. X     negative number to indicate the u and v axes, respectively.  You may
  1199. X     translate, rotate, and scale the texture to map it onto the object's
  1200. X     surface as desired.  Here is an example:
  1201. X
  1202. X     INCLUDE "BasicShapes.data"
  1203. X
  1204. X     OBJECT
  1205. X          QUADRIC Plane_XY END_QUADRIC
  1206. X          TRANSLATE <0.0  -20.0  0.0>
  1207. X
  1208. X          TEXTURE
  1209. X               { make this texture use the x and z axes for the mapping. }
  1210. X               IMAGEMAP <1.0  0.0  -1.0> GIF "image.gif"
  1211. X               SCALE <40.0 40.0 40.0>
  1212. X          END_TEXTURE
  1213. X     END_OBJECT
  1214. X
  1215. X     When I was bored with nothing to do, I decided that it would be neat to
  1216. X     have turbulent texture maps.  So, I said - "what the hell!"  You can
  1217. X     specify TURBULENCE with texture maps and it will perturb the image.  It
  1218. X     may give some bizarre results.  Is this useful?  I dunno.  It was easy
  1219. X     to do so I did it.  Try it out and see what you get.
  1220. X
  1221. XSection 2.9 - Composite Objects
  1222. X
  1223. X     Often it's useful to combine several objects together to act as a whole.
  1224. X     A car, for example, consists of wheels, doors, a roof, etc.  A composite
  1225. X     object allows you to combine all of these pieces into one object.  This
  1226. X     has two advantages.  It makes it easier to move the object as a whole
  1227. X     and it allows you to speed up the ray tracing by defining bounding
  1228. X     shapes that contain the objects.  (Rays are first tested to see if they
  1229. X     intersect the bounding shape.  If not, the entire composite object is
  1230. X     ignored).  Composite objects are defined as follows:
  1231. X
  1232. X     COMPOSITE
  1233. X          OBJECT
  1234. X               ...
  1235. X          END_OBJECT
  1236. X
  1237. X          OBJECT
  1238. X               ...
  1239. X          END_OBJECT
  1240. X          ...
  1241. X
  1242. X          SCALE < 2.0 2.0 2.0 >
  1243. X          ROTATE < 30.0 45.0 160.0 >
  1244. X          TRANSLATE < 100.0 20.0 40.0 >
  1245. X     END_COMPOSITE
  1246. X
  1247. X     Composite objects can contain other composite objects as well as regular
  1248. X     objects.  Composite objects cannot be light sources (although any number
  1249. X     of their components can).  This is because it is nearly impossible to
  1250. X     determine the true "center" of the composite object, and our light
  1251. X     sources are pinpoint ray sources from the center of the light source
  1252. X     object, wherever that may be.
  1253. X
  1254. X
  1255. XSection 2.95 - Bounding Shapes
  1256. X
  1257. X     Let's face it.  This program is no speed demon.  You can save yourself
  1258. X     a lot of time, however, if you use bounding shapes around any complex
  1259. X     objects.  Bounding shapes tell the ray tracer that the object is totally
  1260. X     enclosed by a simple shape.  When tracing rays, the ray is first tested
  1261. X     against the simple bounding shape.  If it strikes the bounding shape,
  1262. X     then the ray is further tested against the more complicated object
  1263. X     inside.
  1264. X
  1265. X     To use bounding shapes, you simply include the following lines into the
  1266. X     declaration of your OBJECT or COMPOSITE_OBJECT:
  1267. X
  1268. X     BOUNDED_BY
  1269. X          a shape
  1270. X     END_BOUND
  1271. X
  1272. X
  1273. X
  1274. X     An example of a Bounding Shape:
  1275. X
  1276. X     OBJECT
  1277. X          INTERSECTION
  1278. X               SPHERE <0.0 0.0 0.0> 2.0 END_SPHERE
  1279. X               PLANE <0.0 1.0 0.0> 0.0 END_PLANE
  1280. X               PLANE <1.0 0.0 0.0> 0.0 END_PLANE
  1281. X          END_INTERSECTION
  1282. X
  1283. X          BOUNDED_BY
  1284. X               SPHERE <0.0 0.0 0.0> 2.0 END_SPHERE
  1285. X          END_BOUND
  1286. X     END_OBJECT
  1287. X
  1288. X     The best bounding shape is a SPHERE since this shape is highly
  1289. X     optimized.  Any shape may be used, however.
  1290. X
  1291. XSection 3 - Showing the final pictures
  1292. X
  1293. X     When the ray tracer draws the picture on the screen, it does not make
  1294. X     good choices for the colour registers.  Without knowing all the needed
  1295. X     colours ahead of time, only approximate guesses can be made.  A post-
  1296. X     processor is really needed to view the final image correctly.  A post-
  1297. X     processor has been provided for the Amiga which scans the picture and
  1298. X     chooses the best possible colour registers.  It then redisplays the
  1299. X     picture.  For the Amiga, "DumpToIFF" can optionally save this picture in
  1300. X     IFF format.  The syntax for the DumpToIFF post-processor is:
  1301. X
  1302. X     DumpToIFF filename
  1303. X
  1304. X     where the filename is the one given in the -o parameter of the ray
  1305. X     tracer.  If you didn't specify the -o option, then use:
  1306. X
  1307. X     DumpToIFF data.dis
  1308. X
  1309. X     If you want to save to an IFF file, then put the name of the IFF file
  1310. X     after the name of the data file:
  1311. X
  1312. X     DumpToIFF data.dis picture
  1313. X
  1314. X     This will create a file called "picture" which contains the IFF image.
  1315. X
  1316. X     For the IBM, you will probably want to use the -t option and write the
  1317. X     image out in TARGA 24 format.  If you have a TARGA or compatible display
  1318. X     adapter, you may view the picture in the full 16 million colors (that's
  1319. X     why they still cost the big $$ bucks).  If you don't, there are several
  1320. X     post-processing programs available to convert the TARGA true-color image
  1321. X     into a more suitable color-mapped image (such as .GIF).  If you have a
  1322. X     VGA or MCGA adapter capable of 320x200 by 256 colors, then you may use
  1323. X     the -d option which will display the image as it generates using only
  1324. X     approximate screen colors.  No hardware test is performed, so if you
  1325. X     don't have a VGA or MCGA, -> DON'T <- use the -d option!
  1326. X
  1327. X     When displaying the image to screen, a HSV conversion method is used
  1328. X     (hue, saturation, value).  This is a convenient way of translating
  1329. X     colors from a "true color" format (16 million) down a "colour mapped"
  1330. X     format of something reasonable (like 256), while still approximating the
  1331. X     color as closely as the available display hardware permits.  As
  1332. X     mentioned previously, the tracer has no way of knowing which colors will
  1333. X     be finally used in the image, nor can it deal properly with all of the
  1334. X     colors which will be generated (up to 16M), so only 4 shades each of 64
  1335. X     possible hues are mapped into the palette DAC, as well as black, white,
  1336. X     and two grey levels. The advantage a post-processor has in choosing
  1337. X     mapped colors is that it can throw away all the unused colors in the
  1338. X     palette map, and thereby free up some space for making better gradient
  1339. X     shades of the colors that are actually used.
  1340. X
  1341. X     There are several available image processing programs that can do this,
  1342. X     a public domain one that is very good is PICLAB, by the Stone Soup Group 
  1343. X     (the folks who brought you FRACTINT).  The procedure is to load the
  1344. X     TARGA file, then use the MAKEPAL command to generate a 256 color map
  1345. X     which is the histogram-weighted average of the most-used colors in the
  1346. X     image (You could also PLOAD a palette file from FRACTINT or one you
  1347. X     previously had saved using PSAVE).  You then MAP the palette onto the
  1348. X     image one of two ways:
  1349. X
  1350. X     1)   If the DITHER variable is OFF, a nearest-match-color-fit is used,
  1351. X          which can sometimes produce unwanted "banding" of colored regions
  1352. X          (called false contours).
  1353. X     2)   If the DITHER variable is ON, then a standard dither is used to
  1354. X          determine final color values.  This is much better at blending the
  1355. X          color bands, but can produce noise in reflections and make mirrors
  1356. X          appear dirty or imperfect.
  1357. X
  1358. X     Then you would typically SHOW the image or GSAVE it into GIF format. 
  1359. X     While the picture is still in the unmapped form (TARGA, etc.) you can
  1360. X     perform a variety of advanced image processing transformations and
  1361. X     conversions, so save the .TGA or .RAW files you make (in case you ever
  1362. X     get a TARGA card, or give them to a friend who has one!).
  1363. X
  1364. X     A commercial product that also does a good job of nearest-match-color-
  1365. X     fit is the CONVERT utility of The AutoDesk Animator.  However, the
  1366. X     dither effect is not as good as that of PICLAB.  To convert the file in
  1367. X     AA's CONVERT, you LOAD TARGA, then in the CONVERT menu, go to the SCALE
  1368. X     function and just hit RENDER.  Click on the DITHER (lights up with an
  1369. X     asterisk when on) if you want it to use it's dithering.  CONVERT will
  1370. X     scale (if asked to) and then do a histogram of total used colors like
  1371. X     PICLAB, but then makes 7 passes on the color map and image to determine
  1372. X     shading thresholds of each hue.  This nearly eliminates the color
  1373. X     banding (false contours) without resorting to dithering.  By now you
  1374. X     must get the feeling DITHER is a 4-letter word.  If you have a low-
  1375. X     resolution display, it is.  If you have too few colors, however, it can
  1376. X     be a saving grace.  At resolutions of 640x400 or higher the "spray
  1377. X     paint" effect of dithering and anti-aliasing is much less noticeable,
  1378. X     and effects a much smoother blending appearance.
  1379. X
  1380. XSection 4 - Handy Hints/Quick Start
  1381. X
  1382. X     -    To see a quick version of your picture, use -w64 -h80 as command
  1383. X          line parameters on the Amiga.  For the IBM, try -w80 -h50.  This
  1384. X          displays the picture in a small rectangle so that you can see how
  1385. X          it will look.
  1386. X
  1387. X     -    Try using the sample default files for different usages - QUICK.DEF
  1388. X          shows a fast postage-stamp rendering (80x50, as above) to the
  1389. X          screen only, LOCKED.DEF will display the picture with anti-aliasing
  1390. X          on (takes forever) with no abort (do this before you go to bed...).
  1391. X          The normal default options file TRACE.DEF is read and you can
  1392. X          supersede this with another .DEF file by specifying it on the
  1393. X          command line, for example:
  1394. X
  1395. X          trace -iworld.dat -oworld.out quick.def
  1396. X
  1397. X     -    When translating light sources, translate the OBJECT, not the
  1398. X          QUADRIC surface.  The light source uses the center of the object as
  1399. X          the origin of the light.
  1400. X
  1401. X     -    When animating objects with solid textures, the textures must move
  1402. X          with the object, i.e. apply the same ROTATE or TRANSLATE functions
  1403. X          to the texture as to the object itself.
  1404. X
  1405. X     -    You can declare constants for most of the data types in the program
  1406. X          including floats and vectors.  By combining this with INCLUDE
  1407. X          files, you can easily separate the parameters for an animation into
  1408. X          a separate file.
  1409. X
  1410. X     -    The amount of ambient light plus diffuse light should be less than
  1411. X          or equal to 1.0.  The program accepts any value, but may produce
  1412. X          strange results.
  1413. X
  1414. X     -    When using ripples, don't make the ripples too deep or you may get
  1415. X          strange results (the dreaded "digital zits"!).
  1416. X
  1417. X     -    Wood textures usually look better when they are scaled to different
  1418. X          values in x, y, and z, and rotated to a different angle.
  1419. X
  1420. X     -    You can sort of dither a colour by placing a floating point number
  1421. X          into the texture record:
  1422. X
  1423. X          TEXTURE
  1424. X               0.05
  1425. X          END_TEXTURE
  1426. X
  1427. X          This adds a small random value to the intensity of the diffuse
  1428. X          light on the object.  Don't make the number too big or you may get
  1429. X          strange results.
  1430. X
  1431. X          Better results can be obtained, however, by doing the dithering in
  1432. X          a post-processor.
  1433. X
  1434. X
  1435. X     -    You can compensate for non-square aspect ratios on the monitors by
  1436. X          making the RIGHT vector in the VIEWPOINT longer or shorter.  A good
  1437. X          value for the Amiga is about 1.333.  This seems ok for IBM's too at
  1438. X          320x200 resolution.  If your spheres and circles aren't round, try
  1439. X          varying it.
  1440. X
  1441. X     -    If you are importing images from other systems, you may find that
  1442. X          the shapes are backwards (left-to-right inverted) and no rotation
  1443. X          can make them right.  All you have to do is negate the terms in the
  1444. X          RIGHT vector of the viewpoint to flip the camera left-to-right.
  1445. X
  1446. X     -    By making the DIRECTION vector in the VIEWPOINT longer, you can
  1447. X          achieve the effect of a zoom lens.
  1448. X
  1449. X     -    When rendering on the Amiga, use a resolution of 319 by 400 to
  1450. X          create a full sized HAM picture.
  1451. X
  1452. X
  1453. XSection 5 - Known Bugs
  1454. X     There is a bug in the code to use Vector constants.  The fix involves
  1455. X     re-working the parser quite a bit and I don't want to do that now.
  1456. X
  1457. X
  1458. XSection 6 - Concluding remarks
  1459. X
  1460. X     I'm sure that there are bugs in the code somewhere, but I've done my
  1461. X     best to remove all the bugs I could find.  I also think that the object
  1462. X     description language needs to be re-worked.  Its current syntax is a bit 
  1463. X     cumbersome.  The system could also use a good graphical interface  :-).
  1464. X
  1465. X     To that end, a conversion utility is supplied which will take in a
  1466. X     Sculpt-Animate 4-D object and map it into DKB's primitive TRIANGLES. 
  1467. X     For the IBM, we have heard, but cannot confirm, there is a utility
  1468. X     around which will convert AUTOCAD .DXF files into Sculpt-4D files.  If
  1469. X     anybody has it or any info about it, please contact either David Buck or
  1470. X     Aaron Collins.
  1471. X
  1472. X     The IBM version is also supplied with two stand-alone TARGA-24 utilities
  1473. X     which were written by Aaron A. Collins.  These are HALFTGA, which will
  1474. X     chop a TARGA-24 file in half in both X and Y dimensions for low-
  1475. X     resolution systems, and another file called GLUETGA which will paste
  1476. X     together several TARGA-24 files (of any resolution) into one.  This is
  1477. X     principally for concatenating together several partial (interrupted)
  1478. X     trace output files into one.
  1479. X
  1480. X     I would like to thank Rick Mallett from Carleton University for his help
  1481. X     in testing this program, for his comments and suggestions, and for
  1482. X     creating the data file for ROMAN.DATA - awesome!
  1483. X
  1484. X     I would also like to thank my beta testers for all the help, bug reports,
  1485. X     suggestions, comments, and time spent.  This version of the ray tracer
  1486. X     wouldn't have been possible without them.  Thanks guys.
  1487. X
  1488. XEnjoy,
  1489. XDavid Buck
  1490. X
  1491. END_OF_FILE
  1492. if test 65462 -ne `wc -c <'Docs/dkb.doc'`; then
  1493.     echo shar: \"'Docs/dkb.doc'\" unpacked with wrong size!
  1494. fi
  1495. # end of 'Docs/dkb.doc'
  1496. fi
  1497. echo shar: End of archive 10 \(of 10\).
  1498. cp /dev/null ark10isdone
  1499. MISSING=""
  1500. for I in 1 2 3 4 5 6 7 8 9 10 ; do
  1501.     if test ! -f ark${I}isdone ; then
  1502.     MISSING="${MISSING} ${I}"
  1503.     fi
  1504. done
  1505. if test "${MISSING}" = "" ; then
  1506.     echo You have unpacked all 10 archives.
  1507.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1508. else
  1509.     echo You still need to unpack the following archives:
  1510.     echo "        " ${MISSING}
  1511. fi
  1512. ##  End of shell archive.
  1513. exit 0
  1514. -- 
  1515. Mail submissions (sources or binaries) to <amiga@uunet.uu.net>.
  1516. Mail comments to the moderator at <amiga-request@uunet.uu.net>.
  1517. Post requests for sources, and general discussion to comp.sys.amiga.
  1518.